// 类装饰器

// 属性装饰器

// 方法装饰器

// 参数装饰器

// const classDecorate = (name: string) => {
//   const classDeco: ClassDecorator = (target: any) => {
//     target.prototype.name = name
//   }
//   return classDeco
// }

// // 装饰器工厂封装axios请求
// const Get = (url: string): MethodDecorator => {
//   return (target, key, descriptor: PropertyDescriptor) => {
//     const func = descriptor.value
//     func()
//   }
// }

// const parameterDeco: ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => {
//   console.log(target);
//   console.log(propertyKey);
//   console.log(parameterIndex);
  
// }

// class FSClass {
//   constructor() { }
//   @Get('https://api.apiopen.top/api/getHaoKanVideo?page=0&size=10')
//   getList() {
//     console.log("I am ok");
//   }

//   getName(@parameterDeco fsName: string) {

//   }
// }

class A {
  
  constructor(public name: string) {
    this.name = name
  }

}


class C {
  constructor(public name: string) {}
}

// class B {
//   entity : any
//   constructor() {
//     this.entity = new A('asan')
//   }
// }
// const fb = new B()
// console.log(fb.entity.name);
// 传统方式中 B 要使用 A中的方法，必须要继承或者示例化A，耦合性太高

// IOC 控制反转，利用中间件进行解耦

class Container {
  modules: any
  constructor() {
    this.modules = {}
  }
  provide(key: string, modules: any) {
    this.modules[key] = modules
  }
  get(key: string) {
    return this.modules[key]
  }
}

const mo = new Container()
mo.provide('a', new A('小冯'))
mo.provide('b', new C("小山"))

class B {
  public a: any
  public b: any
  // 依赖注入
  constructor(container: Container) {
    this.a = container.get('a')
    this.b = container.get('b')
  }
}

const b = new B(mo)
console.log(b.a.name);
console.log(b.b.name);


